/*
 * Copyright (c) 2021, 2022, yzfh.cn All rights reserved.
 *
 */
package com.ly.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author yzfh
 * @Date 2022/02/21 星期一 11:34:24
 */
public class ProxyTest {

    public static void main(String[] args) {

        //目标对象
        Target target = new Target();

        //增强对象
        Advice advice = new Advice();

        //返回值 就是动态生成的代理对象
        //调用代理对象的如何方法 实质执行的都是invoke方法
        TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), //目标对象类加载器
                target.getClass().getInterfaces(), //目标对象相同的接口字节码对象数组
                (proxy1, method, args1) -> {
                    advice.before(); //前置增强
                    Object invoke = method.invoke(target, args1);//执行目标方法
                    advice.afterReturning(); //后置增强
                    return invoke;
                }
        );

        //调用代理对象的方法
        proxy.save();

    }

}
